<?php

namespace app\command;

use PhpAmqpLib\Message\AMQPMessage;
use think\console\Input;
use think\console\Output;

/**
 * 生产者
 */
class SimpleMQProduce extends SimpleMQBase
{
    protected function configure()
    {
        $this->setName("SipleMQ")
            ->setDescription("这是一个队列的HELLO模式");
    }

    protected function execute(Input $input, Output $output)
    {

        $amqpDefail = $this->getConfigDefail('topic');

        $connection = $this->connectRabbitMQ();
        $output->writeln('链接成功');
        $amqpDefail['queue_name'] = $amqpDefail['queue_name'].env('domain.app_id');
        $amqpDefail['exchange_name'] = $amqpDefail['exchange_name'].env('domain.app_id');

        //获取连接的通道
        $channel = $connection->channel();
        //推送成功
        $channel->set_ack_handler(function (AMQPMessage $message)use ($output) {
            $output->writeln('消息推送成功=====》'.$message->getBody());
        });


        //推送失败
        $channel->set_nack_handler(
            function (AMQPMessage $message) use ($output) {
                $output->writeln('消息推送失败=====》'.$message->getBody());
            }
        );
        $channel->confirm_select();
        //初始化交换机
        $channel->exchange_declare($amqpDefail['exchange_name'], $amqpDefail['exchange_type'], false, true, false);

        //申明队列
        /**
         * 关于 queue_declare参数的说明
         * params  queue  队列的名称
         * params  passive 是否消极的声明队列，如果存在，就把队列的信息返回， 如果没有就抛出错误，（是的， 你没看错，这个参数很鸡肋，所以一般为 false）
         * params  durable 是否持久化，意思是说就算队列服务挂了， 也不会丢失队列
         * params  exclusive  是否排外，如果设置为true ,表示只有本次连接中的channel 可以访问，其它channel 是不可以访问的
         * params  auto_delete  设置是否自动删除。为true 则设置队列为自动删除。自动删除的前提是, 至少有一个消费者连接到这个队列，之后所有与这个队列连接的消费者都断开时，才会自动删除
         * params  nowait 相当于做一个异步版的声明， 如果设置成true, 就是说方法调用完就结束，也不用等待创建队列是否成功，一般也设为false
         */
        $channel->queue_declare($amqpDefail['queue_name'], false, true, false, false);

        //绑定队列与交换机
        $channel->queue_bind($amqpDefail['queue_name'], $amqpDefail['exchange_name'], $amqpDefail['route_key']);
        //直接创建一个队列

        //生成消息
        for ($i = 0; $i < 20; $i++) {
            $message = ["name"=>"huang".$i,"age"=>$i,"sex"=>"man".$i];
            $msg = new AMQPMessage(json_encode($message),[
                "delivery_mode"=>AMQPMessage::DELIVERY_MODE_PERSISTENT          //使消息持久化
            ]);
            $channel->basic_publish($msg, $amqpDefail['exchange_name'], $amqpDefail['route_key']);
            $channel->wait_for_pending_acks();
            $output->write(json_encode($message));
            sleep(1);
        }
        $output->write("队列执行完成");
        //生产者调用完成后要关闭资源
        $channel->close();
        //$connection->close();
    }


}